<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <script type="text/javascript" src="./lib/vue-2.4.0.js"></script>
    <style type="text/css">
      .ball {
        width: 15px;
        height: 15px;
        border-radius: 50%;
        background-color: red;
      }
    </style>
  </head>

  <body>
    <!-- 自定义的两组类和使用animate类库无法实现连续的半场动画 必须使用动画的钩子函数(生命周期函数) -->
    <div id="app">
      <input type="button" value="快到碗里来" @click="flag=!flag" />

      <transition
        @before-enter="beforeEnter"
        @enter="enter"
        @after-enter="afterEnter"
      >
        <div class="ball" v-show="flag"></div>
      </transition>
    </div>

    <script type="text/javascript">
      // Vue.directive('focus', {
      //     bind: function () { },
      //     inserted: function () { },
      //     updated() {

      //     }
      // })
      // 创建 Vue实例，得到 ViewModel
      var vm = new Vue({
        el: "#app",
        data: {
          flag: false
        },
        methods: {
          // 类似于自定义指令
          // 注意：动画钩子函数的第一个参数：el，表示 要执行动画的那个DOM元素，是个原生的 JS DOM对象
          // 大家可以认为，el是通过 document.getElementById('') 方式获取到的原生JS DOM对象
          beforeEnter(el) {
            // beforeEnter 表示动画入场之前，此时，动画尚未开始，可以 在 beforeEnter 中，设置元素开始动画之前的起始样式
            // 设置小球开始动画之前的，起始位置
            el.style.transform = "translate(0, 0)";
          },
          enter(el, done) {
            // 这句话，没有实际的作用，但是，如果不写，出不来动画效果；
            // 可以认为 el.offsetWidth 会强制浏览器刷新动画
            // el.offsetHeight;
            // el.offsetLeft;
            // el.offsetTop;
            el.offsetWidth;

            // enter 表示动画 开始之后的样式，这里，可以设置小球完成动画之后的，结束状态
            el.style.transform = "translate(150px, 450px)";
            el.style.transition = "all 1s ease";

            // 这里的 done， 其实就是 afterEnter 这个函数，也就是说：done 是 afterEnter 函数的引用
            done();
          },
          afterEnter(el) {
            // 动画完成之后，会调用 afterEnter
            // console.log('ok')
            this.flag = !this.flag;
          }
        }
      });
    </script>
  </body>
</html>
